<?php
/**
 * GKPHP - 极客框架
 * APP应用管理
 */
namespace GK;
use GK\Exception\ClassNotFoundException;
class App
{
    //应用配置参数
    public static $Config;
    //应用模块名称
    public static $Module;
    //应用控制器名称
    public static $Controller;
    //应用方法名称
    public static $Action;
    //额外加载文件
    public static $file = [];
    // //模块核心配置参数
    // protected static $ModuleConfig;
    /**
     * 执行应用程序
     */
    public static function Run(){
        Route::Register();//启动路由处理模块
        self::InitCommon();//辅助引导加载
        //控制器文件
        if(!empty(self::$Config['AppConfig']['controller_suffix'])){
            $Controller=self::$Controller.self::$Config['AppConfig']['controller_suffix'];
        }else{
            $Controller=self::$Controller;
        }
        $Controller='\\App\\'.self::$Module.'\\Controller\\'.$Controller;//拼接控制器路径
        $Controller=new $Controller();//启动控制器
        $Controller->{self::$Action}();//启动页面方法
    }
    //获取框架核心配置及应用默认配置
    public static function InitConfig(){
        $CoreConfig=Config::All(GK_PATH.'Config'.DS.'Core'.DS.'GKConvention.php');
        $AppConfig=Config::All(APP_PATH.'Config'.DS.'AppConfig.php');
        self::$Config=array_merge($CoreConfig,$AppConfig);
    }
    //加载框架基础库类及公共模块
    public static function InitCommon(){
        //加载应用独立配置文件
        $AppConfig=Config::All(APP_PATH.self::$Module.DS.'Config'.DS.'AppConfig.php');
        if($AppConfig)self::$Config=array_merge(self::$Config,$AppConfig);
        //设置系统时区
        date_default_timezone_set(self::$Config['AppConfig']['default_timezone']);
        //加载公共拓展文件
        $FunctionFile=[
            GK_PATH.'Assistant.php',
            APP_PATH.'Common'.DS.'Function.php',
            APP_PATH.self::$Module.DS.'Common'.DS.'Function.php',
        ];
        foreach($FunctionFile as $Res){
            if(is_file($Res))require_once $Res;
        }
        //DEBUG配置
        if(self::$Config['AppConfig']['app_debug']){
            $whoops = new \Whoops\Run;
            $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
            $whoops->register();
            ini_set('display_error', 'on');
        }else{
            $logger=new \Monolog\Logger("Core");
            $stream=new \Monolog\Handler\StreamHandler(RUNTIME_PATH.'Log'.DS.'Core.log',\Monolog\Logger::DEBUG);
            $logger->pushHandler(new \Monolog\Handler\BufferHandler($stream,10,\Monolog\Logger::DEBUG,true,true));
            \Monolog\ErrorHandler::register($logger);
            \Monolog\Registry::addLogger($logger);
            ini_set('display_error','off');    
        }
    }
}